HandlerThread是Android系统提供的具有消息循环功能的Thread,这里消息循环理所当然也是基于Looper实现。
我们知道UI线程在启动后会通过Looper的prepareMainLooper方法来为UI线程初始化Looper,然后进入消息循环。而其他非UI线程如果也想具有消息机制,同样能通过Looper的prepare方法为其创建Looper,然后通过loop方法进入消息循环。
继承关系
1 | public class HandlerThread extends Thread { |
构造方法
1 | public HandlerThread(String name) { |
HandlerThread的构造方法只是设置线程名字和优先级,优先级默认为THREAD_PRIORITY_DEFAULT
消息循环
1 |
|
当thread启动后调用run方法,在这里我们通过Looper的prepare方法来为线程创建Looper对象,并保存在Looper的ThreadLocal对象中,在调用loop前可以通过onLooperPrepared方法来做一些准备工作。
使用实例
1 | HandlerThread handlerThread = new HandlerThread("myhandlerthread"); |
handlerThread启动后,就可以通过其Looper来构造Handler了,这里我们w为Handler提供了CallBack,这样就可以在这个回调中处理消息了,需要注意的是这个回调是在子线程中进行的,如果消息处理完成后需要更新ui仍需要一个UI Handler来进行。
1 | public Looper getLooper() { |
HandlerThread的getLooper方法会等待线程启动后才会真正返回。而没有启动会直接返回null触发异常。
退出消息循环
我们默认的在run方法中调用了Looper的prepare方法,这个方法默认会调用
Looper的如下方法
1 | private static void prepare(boolean quitAllowed) { |
这个方法的quitAllowed方法为true表示可以推出消息循环,而在UI线程中调用prepareMainLooper方法中默认提供给prepare的值为false表示不允许退出消息循环。
1 | public boolean quit() { |
实际上退出消息循环也是通过looper来完成的,不过最终都是调用MessageQueue的mQueue.quit(true)方法来完成。